<?php
/**
 * 환경 함수
 *
 *
 */

@Header('p3p: CP="CAO DSP AND SO ON" policyref="/w3c/p3p.xml"');

/**
 *
 * 예외상황 처리
 * @param object $exception
 */
function exceptionHandler($exception)
{
    global $DEBUG_INFO;

    if ( $GLOBALS['IS_DEVELOPER'] && $DEBUG_INFO['display_error'] ) {
        $GLOBALS['EXCEPTION'] = $exception;

    } else  if ($GLOBALS['IS_DEVELOPER'] && $DEBUG_INFO['display_error'] == 0) {
        echo $exception->showStackTrace();

    } else {
        header('Location: /500.php');
    }

}

/**
 *
 * 페이지 소멸 시 처리
 */
function _ShutDown()
{
    global $DEBUG_INFO, $aMessageOptionData;

    if (DEBUG || $aMessageOptionData['message_enable'] == 'y') {
        $DEBUG_INFO['type'] = ($aMessageOptionData['message_enable'] == 'y') ? 4 : $DEBUG_INFO['type'];

        $commDebug = new commDebug(_runtime());
        $commDebug->show($DEBUG_INFO['type']);
    }

    if (!is_array($GLOBALS['DATABASE_INSTANCE'])) return;

    unset($GLOBALS['DATABASE_INSTANCE']);
}

/**
 *
 * 어드민 접속인지 확인
 *
 * @return boolean <true | false>
 */
function _isDeveloper()
{
    $_RemoteAddr = $_SERVER['REMOTE_ADDR'];

    // 개발자 아이피
    // hmkim
    if ($_RemoteAddr == '220.117.134.132') {
        return true;
    }

    $aRemoteAddr = explode('.', $_RemoteAddr);
    $aRemoteAddrSlice = array_slice($aRemoteAddr, 0, 3);
    $sRemoteAddr = implode('.', $aRemoteAddrSlice);

    // 사내 아이피 검사
    
    if ($sRemoteAddr == '220.117.134') {
        return true;
    }
    

    // 외부 접속
    return  false;
}

/**
 *
 * 쿠키로 저장 된 debug 정보 조회
 */
function _getDebug()
{
    global $_GET;

    if (empty($_GET['debug']) === true) $_GET['debug'] = null;
    if (empty($_COOKIE['debug']) === true) $_COOKIE['debug'] = null;

    $_GET_DEBUG = $_GET['debug'];
    $_COOKIE_DEBUG = $_COOKIE['debug'];

    if ($_GET_DEBUG == null && $_COOKIE_DEBUG == null) {
        return false;
    }

    // 어드민 접속이 아닐경우 제한
    if (!$GLOBALS['IS_DEVELOPER']) {
        return false;
    }

    parse_str($_COOKIE_DEBUG, $aDebug);

    if ($_GET_DEBUG && empty($aDebug['type'])) {
        $aDebug = array(
            'type' => 1,
            'dev' => 'developer',
            'display_error' => isset($aDebug['display_error']) ? $aDebug['display_error'] : 1,
            'slow_query' =>  isset($aDebug['slow_query']) ? $aDebug['slow_query'] : 0.5,
        );
    }

    return $aDebug;
}

/**
 *
 * model connect - alias
 * @param string $sTable 테이블 명
 * @param string $db 디비 명
 */
function m($sTable, $db = 'main')
{
    if (empty($sTable)) return false;

    return modelCont::getModel($sTable, $db);
}

/**
*
* 마이크로 시간 계산
*
* @return float 마이크로 시간
*/
function _microtime()
{
    list($usec, $sec) = explode(' ', microtime());
    return ( (float)$usec + (float)$sec );
}

// ====================================================================================
// 페이지 시작 시간
// ====================================================================================
$START_TIME = _microtime();

/**
 *
 * 페이지 실행 시간
 */
function _runtime()
{
    global $START_TIME;

    return (_microtime() - $START_TIME);
}

function __d($sKey, $aMessage)
{
    commDebug::setMessage($sKey, $aMessage);
}

/**
 * 데이터 필수 값, 타입 검사
 * 
 * @param array $aData 파라미터 데이터
 * @param array $aEssential 필수 값 조건
 */
function _checkValiableEssential($aData, $aEssential)
{
    if (empty($aData) || empty($aEssential)) return array(true);
    
    foreach ($aEssential as $sKey => $sType) {
        if (empty($aData[$sKey])) return array(false, $sKey);
        
        if (!_checkDataType($sType, $aData[$sKey])) return array(false, $sKey);
    }
    
    return array(true);
}


/**
 * 2차 배열 중 2차 항목 키 추출
 * 
 * @param array $aData
 */
function _getMultiArraykeys($aData) {

    $aKeys = array();
    foreach($aData as $k => $aVal) {
        //$keys[] = $k;
        if (is_array($aVal)) {
            foreach ($aVal as $k2 => $val) {
                $aKeys[] = $k2;
            }
        }
    }
    
    return $aKeys;
}

function _checkDataType($sType, $sVal)
{
    if ($sType == 'numeric') {
        if (!is_numeric($sVal)) return false;
    
    } else if ($sType == 'string') {
        if (!is_string($sVal)) return false;
    }
    
    return true;
}

/**
 * 데이터 타입 검사
 * 
 * @param array $aData
 * @return boolean
 */
function _checkValiableType($aData)
{
    if (empty($aData)) return false;
    
    for ($i = 0, $iLen = count($aData); $i < $iLen; $i++) {
        $_aInfo = $aData[$i];
        
        foreach ($_aInfo as $sVal => $sType) {
            if (!_checkDataType($sType, $sVal)) return false;
        }
    }
    
    return true;
}